package br.com.roteador.motorista;

import java.lang.reflect.InvocationTargetException;
import java.util.Date;
import java.util.ResourceBundle;

import javax.annotation.PostConstruct;
import javax.inject.Inject;

import org.apache.commons.beanutils.BeanUtils;

import br.com.caelum.vraptor.Controller;
import br.com.caelum.vraptor.Get;
import br.com.caelum.vraptor.Path;
import br.com.caelum.vraptor.Post;
import br.com.caelum.vraptor.Result;
import br.com.roteador.component.AcessSession;
import br.com.roteador.component.StringUteis;
import br.com.roteador.controller.BasicController;

@Controller
public class MotoristaController extends BasicController {
    @Inject private MotoristaDAO motoristaDAO;
   
    @Inject
    public MotoristaController(Result result, ResourceBundle bundle, MotoristaDAO motoristaDAO, AcessSession session) {
		this.result = result;
		this.bundle = bundle;
		this.motoristaDAO = motoristaDAO;
		this.session = session;
	}
    
    @PostConstruct
    private void init(){
    	injetaUsuario();
    }
    
    public MotoristaController(){}

    @Path(value = "/" + MOTORISTA)
    @Get
    public void motorista() {
        result.include("listaMotoristas", motoristaDAO.recuperaMotoristas());
    }
   
    @Path(value = "/"+ MOTORISTA +"/" + NOVO)
    @Get
    public void novo() {
        result.include(MOTORISTA, new Motorista());
    }
   
    @Path(value = "/" + MOTORISTA + "/" + EDITAR)
    @Post
    public void editar(String id){
    	if(!StringUteis.isEmpty(id)){
	        Motorista motorista = (Motorista) motoristaDAO.find(Motorista.class, Integer.parseInt(id));
	        result.include(MOTORISTA, motorista);
    	} else {
    		mensagemErro("erro.ao.recuperar");
    	}
    }
   
    @Path(value = "/" + MOTORISTA + "/" + EXCLUIR)
    @Post
    public void excluir(String id){
    	if(!StringUteis.isEmpty(id)){
	        Motorista motorista = (Motorista) motoristaDAO.find(Motorista.class, Integer.parseInt(id));
	        motoristaDAO.remove(motorista);
	        mensagemSucesso("motorista.excluido.sucesso");
    	} else {
    		mensagemErro("erro.ao.excluir");
    	}
        redirect();
    }
   
    @Path(value = "/" + MOTORISTA + "/" + GRAVAR)
    @Post
    public void gravar(Motorista motorista){
    	if(motorista != null){
    		if(StringUteis.isEmpty(motorista.getNome())){
    			mensagemErro("erro.nome.motorista.obrigatorio");
    		}
    		if(StringUteis.isEmpty(motorista.getImei())){
    			mensagemErro("erro.imei.motorista.obrigatorio");
    		}
    		if(resultPossui(ERROR) && resultPossuiConteudo(ERROR)){ redirect(); return;}
	        Motorista pre = motoristaDAO.recuperaMotoristaPorNome(motorista.getNome());
	        if(pre != null){
	        	if(motorista.getId() != null){
		        	/* Se o id dos 2 motoristas forem diferentes
		        	 * */
		        	if(pre.getId() != motorista.getId()){
		        		mensagemErro("erro.motorista.existe");
		        	}else{
		        		try {
			                BeanUtils.copyProperties(pre, motorista);
			            } catch (IllegalAccessException e) {
			            	mensagemErro("erro.ao.gravar");
			            } catch (InvocationTargetException e) {
			            	mensagemErro("erro.ao.gravar");
			            }
			            motoristaDAO.update(pre);
			            mensagemSucesso("motorista.atualizado.sucesso");
		        	}
		        } else {
		        	mensagemErro("erro.motorista.existe");
		        } 
	        } else {
	        	if(motorista.getId() != null){
	        		pre = (Motorista) motoristaDAO.find(Motorista.class, motorista.getId());
	        		Date data = pre.getDataGravacao();
	        		try {
		                BeanUtils.copyProperties(pre, motorista);
		            } catch (IllegalAccessException e) {
		            	mensagemErro("erro.ao.gravar");
		            } catch (InvocationTargetException e) {
		            	mensagemErro("erro.ao.gravar");
		            }
	        		pre.setDataGravacao(data);
	        		pre.setUsuario(session.getUsuario());
	        		motoristaDAO.update(pre);
	        		mensagemSucesso("motorista.atualizado.sucesso");
	        	} else {
	        		motorista.setUsuario(session.getUsuario());
		        	motorista.setDataGravacao(new Date());
		            motoristaDAO.save(motorista);
		            mensagemSucesso("motorista.gravado.sucesso");
	        	}
	        }
    	} else {
    		mensagemErro("erro.ao.gravar");
    	}
        redirect();
    }

    protected void redirect() {
        result.redirectTo(MotoristaController.class).motorista();
    }

}